iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
Modern Web

以前端角度探討遊戲化的資訊設計系列 第 10

Day 10 - RXJS 事件流

  • 分享至 

  • xImage
  •  
    const keydown$ = Rx.Observable
      .fromEvent(document, 'keydown', e => {
        switch (e.keyCode) {
          case KEYCODE.left:
            return  -1
          case KEYCODE.right:
            return 1
          default:
        }
      });

    const keyup$ = Rx.Observable
      .fromEvent(document, 'keyup', e => {
        switch (e.keyCode) {
          case KEYCODE.left:
            return  -1
          case KEYCODE.right:
            return 1
          default:
        }
      })
      .withLatestFrom(keydown$)
      .filter(([keyup, keydown]) => {
        return keyup === keydown
      })
      .map(x => 0)

    const input$ = Rx.Observable
      .merge(keydown$, keyup$)
      .startWith(0)
      .distinctUntilChanged();

    const ticker$ = Rx.Observable
      .interval(0, Rx.Scheduler.requestAnimationFrame)

    const state$ = ticker$
      .withLatestFrom(input$)
      .scan(({kp}, [ticker, input]) => {
        switch (input) {
          case -1:
            kp.vx = -1;
            kp.side = 'LEFT';
            kp.ani = 'RUN';
            break;
          case 1:
            kp.vx = 1;
            kp.side = 'RIGHT';
            kp.ani = 'RUN';
            break;
          case 0:
            kp.vx = 0;
            kp.ani = 'STAND';
            break;
          default:
        }

        return {kp}
      }, initalState)

    ticker$
    .withLatestFrom(state$)
    .subscribe(([ticker, state]) => {
      pixiRender.render(state, renderer)
    })

上一篇
Day 09 - simple change direction
下一篇
Day 11 - 介紹資訊設計對話式遊戲
系列文
以前端角度探討遊戲化的資訊設計13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言